为什么你在opensea“铸造”的NFT不需要交gas费?
众所周知,所有对区块链进行写入的操作都需要缴纳gas费,NFT的mint过程就是将NFT数据写入区块链的过程,一定需要交gas费的,但是相信已经有不少朋友尝试过在opensea里上传一张图片,会发现并不需要交gas费,这是怎么回事呢?你真的将它铸造出来了吗?
opensea使用了一种叫 lazy minting 的方式实现了无需gas费的效果,当你在opensea上传图片后,它并没有上链,而是先存储在了opensea的数据库中,所以不会消耗任何区块链资源从而要求你支付gas费,等到有人购买你的NFT时,它才会被铸造到链上并转移至买家,所以这个方法将铸造NFT的成本放在了买家而非创作者身上,从而极大的降低了创作门槛。
原理明白了,那这个过程具体是如何实现的呢?
NFT创建者不是通过调用合约直接创建NFT,而是使用以太坊账户的私钥生成加密签名,签名数据充当兑换NFT的凭证,凭证包含实际NFT的所有信息,买家想购买NFT时,调用redeem函数来进行验证,如果验证通过则正式在链上创建NFT并将其转移给购买者。
当购买者真正真正为该NFT进行mint上链后,将读取该凭证的数据完成上链过程,如下图所示的凭证数据,tokenId和uri将被记录在区块链中(可回顾当你在买NFT时,你买到的究竟是什么?了解tokenId和uri代表什么),mintPirce是创建者设置的价格,不会被记录在区块链中,但是当被正式上链时会读取该参数并要求购买者支付给创建者。signature则是创建者的签名。
创建签名使用的是EIP 712协议,下图为签名生成代码,设定好凭证数据后调用_signTypeData传入即可生成签名。
下图的redeem函数则是购买者在购买时进行mint的过程,传入的两个参数分别为redeemer(购买者账号)和NFTVocher(凭证数据)。
首先调用_verify用来获取该NFT的创建者地址,然后校验购买者支付的费用是否大于mint费。
调用_mint传入signer创建者地址,和NFT编号,注意这里传入的是创建者地址,意味着虽然mint的费用是购买者支付的,但是依然是先由创建者mint后再调用_transfer转移给购买者。